package com.rybbaby.tss.core.utils;

import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.Map;
import java.util.Properties;
import java.util.TreeMap;
import org.apache.commons.lang.SystemUtils;
import org.hyperic.sigar.CpuInfo;
import org.hyperic.sigar.CpuPerc;
import org.hyperic.sigar.FileSystem;
import org.hyperic.sigar.FileSystemUsage;
import org.hyperic.sigar.Mem;
import org.hyperic.sigar.NetFlags;
import org.hyperic.sigar.NetInterfaceConfig;
import org.hyperic.sigar.NetInterfaceStat;
import org.hyperic.sigar.OperatingSystem;
import org.hyperic.sigar.Sigar;
import org.hyperic.sigar.SigarException;
import org.hyperic.sigar.Swap;
import org.hyperic.sigar.Who;

/**
 * @author 谢进伟
 * @description
 * @createDate 2016年11月30日 下午5:23:14
 */
public class ServiceInfo {
	
	public Map<String , Object> property() throws UnknownHostException {
		Map<String , Object> info = new TreeMap<String , Object>();
		Runtime r = Runtime.getRuntime();
		Properties props = System.getProperties();
		InetAddress addr;
		addr = InetAddress.getLocalHost();
		String ip = addr.getHostAddress();
		Map<String , String> map = System.getenv();
		String userName = map.get("USERNAME");// 获取用户名
		String computerName = map.get("COMPUTERNAME");// 获取计算机名
		String userDomain = map.get("USERDOMAIN");// 获取计算机域名
		info.put("用户名" , userName);
		info.put("计算机名" , computerName);
		info.put("计算机域名" , userDomain);
		info.put("本地ip地址" , ip);
		info.put("本地主机名" , addr.getHostName());
		info.put("JVM可以使用的总内存" , r.totalMemory());
		info.put("JVM可以使用的剩余内存" , r.freeMemory());
		info.put("JVM可以使用的处理器个数" , r.availableProcessors());
		info.put("Java的运行环境版本" , props.getProperty("java.version"));
		info.put("Java的运行环境供应商" , props.getProperty("java.vendor"));
		info.put("Java供应商的URL" , props.getProperty("java.vendor.url"));
		info.put("Java的安装路径" , props.getProperty("java.home"));
		info.put("Java的虚拟机规范版本" , props.getProperty("java.vm.specification.version"));
		info.put("Java的虚拟机规范供应商" , props.getProperty("java.vm.specification.vendor"));
		info.put("Java的虚拟机规范名称" , props.getProperty("java.vm.specification.name"));
		info.put("Java的虚拟机实现版本" , props.getProperty("java.vm.version"));
		info.put("Java的虚拟机实现供应商" , props.getProperty("java.vm.vendor"));
		info.put("Java的虚拟机实现名称" , props.getProperty("java.vm.name"));
		info.put("Java运行时环境规范版本" , props.getProperty("java.specification.version"));
		info.put("Java运行时环境规范供应商" , props.getProperty("java.specification.vender"));
		info.put("Java运行时环境规范名称" , props.getProperty("java.specification.name"));
		info.put("Java的类格式版本号" , props.getProperty("java.class.version"));
		info.put("Java的类路径" , props.getProperty("java.class.path"));
		info.put("加载库时搜索的路径列表" , props.getProperty("java.library.path"));
		info.put("默认的临时文件路径" , props.getProperty("java.io.tmpdir"));
		info.put("一个或多个扩展目录的路径" , props.getProperty("java.ext.dirs"));
		info.put("操作系统的名称" , props.getProperty("os.name"));
		info.put("操作系统的构架" , props.getProperty("os.arch"));
		info.put("操作系统的版本" , props.getProperty("os.version"));
		info.put("文件分隔符" , props.getProperty("file.separator"));
		info.put("路径分隔符" , props.getProperty("path.separator"));
		info.put("行分隔符" , props.getProperty("line.separator"));
		info.put("用户的账户名称" , props.getProperty("user.name"));
		info.put("用户的主目录" , props.getProperty("user.home"));
		info.put("用户的当前工作目录" , props.getProperty("user.dir"));
		return info;
	}
	
	public Map<String , Object> memory() throws SigarException {
		Map<String , Object> info = new TreeMap<String , Object>();
		Sigar sigar = new Sigar();
		Mem mem = sigar.getMem();
		// 内存总量
		info.put("内存总量" , FileUtils.convertFileSize(mem.getTotal()) + " av");
		// 当前内存使用量
		info.put("当前内存使用量" , FileUtils.convertFileSize(mem.getUsed()) + " used");
		// 当前内存剩余量
		info.put("当前内存剩余量" , FileUtils.convertFileSize(mem.getFree()) + " free");
		Swap swap = sigar.getSwap();
		// 交换区总量
		info.put("交换区总量" , FileUtils.convertFileSize(swap.getTotal()) + " av");
		// 当前交换区使用量
		info.put("当前交换区使用量" , FileUtils.convertFileSize(swap.getUsed()) + " used");
		// 当前交换区剩余量
		info.put("当前交换区剩余量" , FileUtils.convertFileSize(swap.getFree()) + " free");
		return info;
	}
	
	public Map<String , Object> cpu() throws SigarException {
		Map<String , Object> info = new TreeMap<String , Object>();
		info.put("JAVA_CLASS_PATH" , SystemUtils.JAVA_CLASS_PATH);
		info.put("JAVA_HOME" , SystemUtils.JAVA_HOME);
		Sigar sigar = new Sigar();
		CpuInfo infos [] = sigar.getCpuInfoList();
		CpuPerc cpuList [] = null;
		cpuList = sigar.getCpuPercList();
		for(int i = 0 ; i < infos.length ; i++) {// 不管是单块CPU还是多CPU都适用
			CpuInfo cpuInfo = infos[i];
			info.put("第" + (i + 1) + "块CPU的总量MHz" , cpuInfo.getMhz());// CPU的总量MHz
			info.put("第" + (i + 1) + "块CPU生产商" , cpuInfo.getVendor());// 获得CPU的卖主，如：Intel
			info.put("第" + (i + 1) + "块CPU类别" , cpuInfo.getModel());// 获得CPU的类别，如：Celeron
			info.put("第" + (i + 1) + "块CPU缓存数量" , cpuInfo.getCacheSize());// 缓冲存储器数量
			Map<String , Object> cpuPerc = cpuPerc((i + 1) , cpuList[i]);
			info.putAll(cpuPerc);
		}
		return info;
	}
	
	public Map<String , Object> cpuPerc(int count , CpuPerc cpu) {
		Map<String , Object> info = new TreeMap<String , Object>();
		info.put("第" + count + "块CPU用户使用率" , CpuPerc.format(cpu.getUser()));// 用户使用率
		info.put("第" + count + "块CPU系统使用率" , CpuPerc.format(cpu.getSys()));// 系统使用率
		info.put("第" + count + "块CPU当前等待率" , CpuPerc.format(cpu.getWait()));// 当前等待率
		info.put("第" + count + "块CPU当前错误率" , CpuPerc.format(cpu.getNice()));// 当前错误率
		info.put("第" + count + "块CPU当前空闲率" , CpuPerc.format(cpu.getIdle()));// 当前空闲率
		info.put("第" + count + "块CPU总的使用率" , CpuPerc.format(cpu.getCombined()));// 总的使用率
		return info;
	}
	
	public Map<String , Object> os() {
		Map<String , Object> info = new TreeMap<String , Object>();
		OperatingSystem OS = OperatingSystem.getInstance();
		// 操作系统内核类型如： 386、486、586等x86
		info.put("操作系统" , OS.getArch());
		info.put("操作系统CpuEndian()" , OS.getCpuEndian());//
		info.put("操作系统DataModel()" , OS.getDataModel());//
		// 系统描述
		info.put("操作系统的描述" , OS.getDescription());
		// 操作系统的卖主
		info.put("操作系统的卖主" , OS.getVendor());
		// 卖主名称
		info.put("操作系统的卖主名" , OS.getVendorCodeName());
		// 操作系统名称
		info.put("操作系统名称" , OS.getVendorName());
		// 操作系统卖主类型
		info.put("操作系统卖主类型" , OS.getVendorVersion());
		// 操作系统的版本号
		info.put("操作系统的版本号" , OS.getVersion());
		return info;
	}
	
	public Map<String , Object> who() throws SigarException {
		Map<String , Object> info = new TreeMap<String , Object>();
		Sigar sigar = new Sigar();
		Who who [] = sigar.getWhoList();
		if(who != null && who.length > 0) {
			for(int i = 0 ; i < who.length ; i++) {
				// info.put("当前系统进程表中的用户名", String.valueOf(i));
				Who _who = who[i];
				info.put("用户控制台" , _who.getDevice());
				info.put("用户host" , _who.getHost());
				// info.put("getTime()", _who.getTime());
				// 当前系统进程表中的用户名
				info.put("当前系统进程表中的用户名" , _who.getUser());
			}
		}
		return info;
	}
	
	public Map<String , Object> file() throws Exception {
		Map<String , Object> info = new TreeMap<String , Object>();
		Sigar sigar = new Sigar();
		FileSystem fslist [] = sigar.getFileSystemList();
		for(int i = 0 ; i < fslist.length ; i++) {
			info.put("分区的盘符名称" , i);
			FileSystem fs = fslist[i];
			// 分区的盘符名称
			info.put("盘符名称" , fs.getDevName());
			// 分区的盘符名称
			info.put("盘符路径" , fs.getDirName());
			info.put("盘符标志" , fs.getFlags());//
			// 文件系统类型，比如 FAT32、NTFS
			info.put("盘符类型" , fs.getSysTypeName());
			// 文件系统类型名，比如本地硬盘、光驱、网络文件系统等
			info.put("盘符类型名" , fs.getTypeName());
			// 文件系统类型
			info.put("盘符文件系统类型" , fs.getType());
			FileSystemUsage usage = null;
			usage = sigar.getFileSystemUsage(fs.getDirName());
			switch(fs.getType()){
				case 0: // TYPE_UNKNOWN ：未知
					break;
				case 1: // TYPE_NONE
					break;
				case 2: // TYPE_LOCAL_DISK : 本地硬盘
					// 文件系统总大小
					info.put(fs.getDevName() + "总大小" , FileUtils.convertFileSize(usage.getTotal() * 1024));
					// 文件系统剩余大小
					info.put(fs.getDevName() + "剩余大小" , FileUtils.convertFileSize(usage.getFree() * 1024));
					// 文件系统可用大小
					info.put(fs.getDevName() + "可用大小" , FileUtils.convertFileSize(usage.getAvail() * 1024));
					// 文件系统已经使用量
					info.put(fs.getDevName() + "已经使用量" , FileUtils.convertFileSize(usage.getUsed() * 1024));
					double usePercent = usage.getUsePercent() * 100D;
					// 文件系统资源的利用率
					info.put(fs.getDevName() + "资源的利用率" , usePercent + "%");
					break;
				case 3:// TYPE_NETWORK ：网络
					break;
				case 4:// TYPE_RAM_DISK ：闪存
					break;
				case 5:// TYPE_CDROM ：光驱
					break;
				case 6:// TYPE_SWAP ：页面交换
					break;
			}
			info.put(fs.getDevName() + "读出" , FileUtils.convertFileSize(usage.getDiskReadBytes()));
			info.put(fs.getDevName() + "写入" , FileUtils.convertFileSize(usage.getDiskWriteBytes()));
		}
		return info;
	}
	
	public Map<String , Object> net() throws Exception {
		Map<String , Object> info = new TreeMap<String , Object>();
		Sigar sigar = new Sigar();
		String ifNames [] = sigar.getNetInterfaceList();
		for(int i = 0 ; i < ifNames.length ; i++) {
			String name = ifNames[i];
			NetInterfaceConfig ifconfig = sigar.getNetInterfaceConfig(name);
			info.put("网络设备名" , name);// 网络设备名
			info.put("IP地址" , ifconfig.getAddress());// IP地址
			info.put("子网掩码" , ifconfig.getNetmask());// 子网掩码
			if((ifconfig.getFlags() & 1L) <= 0L) {
				continue;
			}
			NetInterfaceStat ifstat = sigar.getNetInterfaceStat(name);
			info.put(name + "接收的总包裹数:" , ifstat.getRxPackets());// 接收的总包裹数
			info.put(name + "发送的总包裹数:" , ifstat.getTxPackets());// 发送的总包裹数
			info.put(name + "接收到的总字节数:" , FileUtils.convertFileSize(ifstat.getRxBytes()));// 接收到的总字节数
			info.put(name + "发送的总字节数:" , FileUtils.convertFileSize(ifstat.getTxBytes()));// 发送的总字节数
			info.put(name + "接收到的错误包数:" , ifstat.getRxErrors());// 接收到的错误包数
			info.put(name + "发送数据包时的错误数:" , ifstat.getTxErrors());// 发送数据包时的错误数
			info.put(name + "接收时丢弃的包数:" , ifstat.getRxDropped());// 接收时丢弃的包数
			info.put(name + "发送时丢弃的包数:" , ifstat.getTxDropped());// 发送时丢弃的包数
		}
		return info;
	}
	
	public Map<String , Object> ethernet() throws SigarException {
		Map<String , Object> info = new TreeMap<String , Object>();
		Sigar sigar = null;
		sigar = new Sigar();
		String [] ifaces = sigar.getNetInterfaceList();
		for(int i = 0 ; i < ifaces.length ; i++) {
			NetInterfaceConfig cfg = sigar.getNetInterfaceConfig(ifaces[i]);
			if(NetFlags.LOOPBACK_ADDRESS.equals(cfg.getAddress()) || (cfg.getFlags() & NetFlags.IFF_LOOPBACK) != 0 || NetFlags.NULL_HWADDR.equals(cfg.getHwaddr())) {
				continue;
			}
			info.put(cfg.getName() + "IP地址:" , cfg.getAddress());// IP地址
			info.put(cfg.getName() + "网关广播地址:" , cfg.getBroadcast());// 网关广播地址
			info.put(cfg.getName() + "网卡MAC地址:" , cfg.getHwaddr());// 网卡MAC地址
			info.put(cfg.getName() + "子网掩码:" , cfg.getNetmask());// 子网掩码
			info.put(cfg.getName() + "网卡描述信息:" , cfg.getDescription());// 网卡描述信息
			info.put(cfg.getName() + "网卡类型" , cfg.getType());//
		}
		return info;
	}
}